package com.gdust.hzx.manager.task;

import cn.hutool.core.date.DateUtil;
import com.gdust.hzx.manager.mapper.OrderStatisticsMapper;
import com.gdust.hzx.manager.mapper.OrderInfoMapper;
import com.gdust.hzx.model.entity.order.OrderStatistics;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * ClassName: OrderStatisticsTask
 * Package: com.gdust.spzx.manager.task
 * Description:定时任务程序：订单统计任务
 *
 * 该类用于通过定时任务的方式统计订单数据，并将统计结果存储到数据库中。
 * 定时任务由 Spring 的 @Scheduled 注解实现，按照指定的时间计划执行。
 *
 * @Author syun
 * @Create 2024/12/24 16:51
 * @Version 1.0
 */
@Component
@Slf4j
public class OrderStatisticsTask {
    // 注入订单表的 Mapper，用于查询订单数据
    @Autowired
    private OrderInfoMapper orderInfoMapper;

    // 注入订单统计表的 Mapper，用于存储统计数据
    @Autowired
    private OrderStatisticsMapper orderStatisticsMapper;


    /**
     * 定时任务：统计订单总金额
     *
     * 该方法通过定时任务，每天凌晨 2 点执行，统计前一天的订单交易金额，并将统计结果存储到订单统计表中。
     * 执行计划通过 @Scheduled 注解的 cron 表达式定义。
     *
     * cron 表达式说明：0 0 2 * * ?
     * - 每天凌晨 2 点执行一次任务
     * - 0 秒，0 分钟，2 小时，所有日期、所有月份、任意星期
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void orderTotalAmountStatistics(){
        System.out.println(new Date().toInstant());

        // 1. 获取前一天的日期，格式为 "yyyy-MM-dd"
        String createDate =
                DateUtil.offsetDay(new Date(), -1).toString("yyyy-MM-dd");

        //2.根据前一天日期进行统计功能(分组操作)
        //统计前一天交易金额
        OrderStatistics orderStatistics =
                orderInfoMapper.selectStatisticsByDate(createDate);

        //3.把统计之后的数据，添加到统计结果表里面
        if(orderStatistics != null){
            // 如果统计结果不为空，则插入到统计结果表
            orderStatisticsMapper.insert(orderStatistics);
        }
    }


}
